package com.gator.desig_mode.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author 何章怀晓 hezhanghuaixiao
 * @version V1.0
 * @desc 对被代理对象增强的逻辑可写在代理对象里
 */
public class ProxyFactory {

  private Object target;//通过接口聚合被代理对象

  //构造器指定被代理对象的接口，接口的本质是具体实现类对象
  public ProxyFactory(Object target) {
    this.target = target;
  }


  //根据传入的被代理对象利用反射机制创建代理对象
  //1.目标对象（被代理对象的类加载器）
  //2.目标对象的接口类型，被代理对象需要接口抽象,即目标对象实现的接口列表
  //3.
  public Object getProxyInstance() {

    return Proxy.newProxyInstance(target.getClass().getClassLoader()
        , target.getClass().getInterfaces()
        , new InvocationHandler() {
          @Override
          //proxy是被代理对象
          //method是调用的方法，调用哪个这里就是那个
          //aegs是被调用的方法参数列表
          public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("JDK代理开始...");
            //反射调用目标对象的方法
            //System.out.println(proxy);

            return method.invoke(target, args);
          }
        });
  }


}
